<?
/**
 * OpenPASL
 *
 * Copyright (c) 2008, Danny Graham, Scott Thundercloud
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 *   * Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *   * Neither the name of the Danny Graham, Scott Thundercloud, nor the names of
 *     their contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
 * @copyright Copyright (c) 2008, Danny Graham, Scott Thundercloud
 */

namespace PASL\Interpreter\JavaScript;

require_once('PASL/Interpreter/iInterpreter.php');


use PASL\Interpreter\iInterpreter;

/**
 * Class for handling JavaScript interpretation
 * 
 * !!!!! THIS CLASS REQUIRES THE PECL-SPIDERMONKEY PACKAGE !!!!!
 * 
 * Find it at http://pecl.php.net/package/spidermonkey/
 * More information at http://www.bombstrike.org/2009/02/bringing-javascript-to-the-server/
 * 
 * @package PASL_Interpreter_JavaScript
 * @category JavaScript Interpeter
 * @author Scott Thundercloud <scott.tc@gmail.com>
 */
class SpiderMonkey extends \JSContext implements iInterpreter
{
	/**
	 * The template file to be interpreted
	 * 
	 * @var string
	 */
	protected $File = null;

	/**
	 * Assign a variable inside of the language
	 * 
	 * @return void 
	 * @param string $name
	 * @param string $value
	 */
	public function assignVariable($name, $value)
	{
		parent::assign($name, $value);
	}

	/**
	 * Set a class inside of the language
	 * 
	 * @return void 
	 * @param string $className
	 * @param string $exportedName[optional]
	 */
	public function registerClass($className, $exportedName=null)
	{
		parent::registerClass($className, $exportedName);
	}

	/**
	 * Register a function inside of the language
	 * 
	 * @return 
	 * @param string $functionName
	 * @param string $exportedName[optional]
	 */
	public function registerFunction($functionName, $exportedName=null)
	{
		parent::registerFunction($functionName, $exportedName);
	}

	/**
	 * Register an object inside of the language
	 * 
	 * @return void 
	 * @param string $name
	 * @param string $value
	 */
	public function registerObject($name, $value)
	{
		parent::assign($name, $value);
	}

	/**
	 * Evaluate a string
	 * 
	 * @return string evaluated data 
	 * @param string $scriptContent
	 */
	public function evaluateScript($scriptContent)
	{
		ob_start();

		parent::evaluateScript($scriptContent);

		$contents_js = ob_get_contents();

		ob_end_clean();

		return $contents_js;
	}

	/**
	 * Set a file to be interpreted
	 * 
	 * @return void 
	 * @param string $File
	 */
	public function setFile($File)
	{
		$this->File = $File;
	}

	/**
	 * Evaluate the set file and return the contents
	 * 
	 * @return void 
	 */
	public function Run()
	{
		$contents = file_get_contents($this->File);
		$contents_js = $this->evaluateScript($contents);

		return $contents_js;
	}
}
 ?>